package view

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"os"
	"path/filepath"
)

func FileUpload(ctx *gin.Context) {
	// 获取上传的文件
	file, err := ctx.FormFile("file")
	if err != nil {
		ctx.String(http.StatusBadRequest, fmt.Sprintf("获取文件失败: %v", err))
		return
	}

	contentType := file.Header.Get("Content-Type")
	log.Printf("上传的文件 filename= %s, size= %d, contentType= %s", file.Filename, file.Size, contentType)

	// 创建临时文件，使用更安全的命名模式
	// 注意：临时文件扩展名应与原文件保持一致
	filename := filepath.Base(file.Filename)
	tempFile, err := os.CreateTemp("", fmt.Sprintf("upload*-%s", filename))
	if err != nil {
		ctx.String(http.StatusInternalServerError, fmt.Sprintf("创建临时文件失败: %v", err))
		return
	}
	defer func() {
		tempFile.Close()
	}()

	// 将上传文件保存到指定路径
	if err := ctx.SaveUploadedFile(file, tempFile.Name()); err != nil {
		ctx.String(http.StatusInternalServerError, fmt.Sprintf("保存文件时发生异常: %s", err.Error()))
		return
	}
	log.Printf("上传的文件 已经保存成功。文件路径: %s", tempFile.Name())

	ctx.JSON(200, gin.H{
		"isOk": true,
		"msg":  "upload success",
	})
}

func FileDownload(ctx *gin.Context) {
	filePath := ctx.Query("file")
	log.Println("download file = ", filePath)

	if filePath == "" {
		ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": "缺少文件路径参数"})
		return
	}
	fileInfo, err := os.Stat(filePath)

	if os.IsNotExist(err) {
		ctx.AbortWithStatusJSON(http.StatusNotFound, gin.H{"error": "要下载的文件不存在"})
		return
	}

	if fileInfo.IsDir() {
		ctx.AbortWithStatusJSON(http.StatusForbidden, gin.H{"error": "不支持下载目录"})
		return
	}

	// 设置响应头
	ctx.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filepath.Base(filePath)))
	ctx.Header("Content-Type", "application/octet-stream;charset=utf-8")
	ctx.Header("Content-Length", fmt.Sprintf("%d", fileInfo.Size()))
	// 发送文件内容
	http.ServeFile(ctx.Writer, ctx.Request, filePath)

}
